import { ElMessageBox, type Action } from 'element-plus'
interface ConfirmOptions {
  /** 提示消息内容 */
  message: string
  /** 确认按钮点击回调 */
  onConfirm?: () => void | Promise<void>
  /** 取消按钮点击回调 */
  onCancel?: () => void
  /** 确认按钮文字 (默认: '确定') */
  confirmText?: string
  /** 取消按钮文字 (默认: '取消') */
  cancelText?: string
  /** 是否显示取消按钮 (默认: true) */
  showCancel?: boolean
  /** 弹窗标题 (默认: '提示') */
  title?: string
  /** 弹窗类型 (默认: 'warning') */
  type?: 'success' | 'warning' | 'info' | 'error'
  /** 是否允许点击遮罩层关闭 (默认: false) */
  closeOnClickModal?: boolean
  /** 自定义确认按钮类名 */
  confirmButtonClass?: string
  /** 自定义取消按钮类名 */
  cancelButtonClass?: string
}

/**
 * 封装 Element Plus 确认对话框
 * @param options 配置选项
 * @returns Promise<void>
 */
export const confirmMessageBox = (options: ConfirmOptions): Promise<void> => {
  const {
    message,
    onConfirm,
    onCancel,
    confirmText = '确定',
    cancelText = '取消',
    showCancel = true,
    title = '提示',
    type = 'warning',
    closeOnClickModal = false,
    confirmButtonClass = '',
    cancelButtonClass = ''
  } = options

  return ElMessageBox.confirm(message, title, {
    confirmButtonText: confirmText,
    cancelButtonText: cancelText,
    showCancelButton: showCancel,
    type,
    closeOnClickModal,
    confirmButtonClass,
    cancelButtonClass,
    distinguishCancelAndClose: true // 区分取消和关闭
  })
    .then(async () => {
      if (onConfirm) {
        await Promise.resolve(onConfirm()) // 支持异步回调
      }
    })
    .catch((action: Action) => {
      if (action === 'cancel' && onCancel) {
        onCancel()
      }
    })
}

/**
 * 危险操作确认 (红色按钮强调)
 * @param options 配置选项
 */
export const confirmDanger = (options: Omit<ConfirmOptions, 'type'>) => {
  return confirmMessageBox({
    ...options,
    type: 'error',
    confirmButtonClass: 'el-button--danger'
  })
}

/**
 * 删除确认快捷方法
 * @param itemName 要删除的项目名称
 * @param onConfirm 确认回调
 */
export const confirmDelete = (itemName: string, onConfirm: () => void) => {
  return confirmDanger({
    title: '删除确认',
    message: `确定要删除 ${itemName} 吗？此操作不可撤销！`,
    confirmText: '删除',
    onConfirm
  })
}
